function x_next = prediction_model(x, u, P_load)
% =========================================================================
% prediction_model.m - NMPC控制器内部的非线性状态预测模型
% 公式: x(k+1) = f(x(k), u(k), P_load(k))
% =========================================================================
% 输入:
%   x:      当前状态向量 [SOC; P_fc; alpha_decay]
%   u:      当前控制输入 beta
%   P_load: 当前测量扰动 P_load
% 输出:
%   x_next: 预测的下一个状态向量

    % 从外部工作区加载模型参数，persistent使其只加载一次，提高效率
    persistent BattParams FCParams SimParams
    if isempty(BattParams)
        BattParams = evalin('base', 'BattParams');
        FCParams   = evalin('base', 'FCParams');
        SimParams  = evalin('base', 'SimParams');
    end

    dt = SimParams.Ts;
    
    % --- 提取当前状态和控制量 ---
    SOC_k        = x(1);
    P_fc_k       = x(2);
    alpha_decay_k = x(3);
    beta_k       = u(1);
    
    % --- 1. 功率分配计算 ---
    % 电池功率 = 总负载功率 - 燃料电池分配到的功率
    % 指令燃料电池功率
    P_fc_cmd = beta_k * P_load
    P_bat = P_load*(1-beta_k)
    % --- 2. 状态更新方程：计算 x(k+1) ---

    % b) P_fc(k+1) 的计算
    %    公式含义: 这是一个一阶惯性环节的离散化形式，模拟燃料电池功率响应的延迟。
    %    下一时刻功率 = 当前功率 + (时间步长/时间常数) * (指令功率 - 当前功率)
    pfc_next = P_fc_cmd;

    % a) SOC(k+1) 的计算
    %    公式含义: 下一时刻的SOC = 当前SOC - 消耗的SOC。
    %    消耗的SOC通过安时积分法计算: (电流 * 时间) / 总容量
    I_bat = P_bat / interp1(BattParams.OCV_SOC_map(1,:), BattParams.OCV_SOC_map(2,:), SOC_k, 'linear', 'extrap');
    soc_next = SOC_k - (I_bat * dt) / BattParams.Capacity_As;

    % c) alpha_decay(k+1) 的计算
    %    公式含义: 下一时刻的总衰减 = 当前总衰减 + 这个时间步内产生的衰减增量。
    %    衰减增量由两部分组成：稳定负载引起的衰减和功率波动引起的衰减。
    %    注意：这里使用(pfc_next - P_fc_k)作为功率波动，是MPC内部预测的合理简化。
    delta_pfc = pfc_next - P_fc_k;
    delta_alpha = (FCParams.C1 * P_fc_k^2 + FCParams.C2 * delta_pfc^2) * dt;
    alpha_next = alpha_decay_k + delta_alpha;

    % --- 组合成下一个状态向量 ---
    x_next = [soc_next; pfc_next; alpha_next];
end